﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using System.Data.Objects;
using FrameworkLib.Facades;
using FrameworkLib.Filters;
using LinqKit;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class MovimentiFacade : FacadeBase<GestionePolveriEntities>
    {
        GestionePolveriEntities context = null;

        public MovimentiFacade()
        {
            context = this.GetContext();
        }

        public MovimentiFacade(string connectionString)
        {
            context = this.GetContext(connectionString);
        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            //qui
            this.RunAsync(() => GetMovimenti("C"), callback, "C");
        }

        public void LoadAsyncS(BackgroundWorkerCallbackBase.Callback callback)
        {
            //qui
            this.RunAsync(() => GetMovimenti("S"), callback, "C");
        }

        public void LoadAsyncAll(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetMovimenti(), callback);
        }

        public List<Movimento> GetMovimenti(string codiceCausale, DateTime dtreg)
        {
            List<Movimento> retValue = null;

            try
            {
                //DateTime m_dataFrom = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
                //DateTime m_dataTo = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 0);

                DateTime m_dataFrom = new DateTime(dtreg.Year, dtreg.Month, dtreg.Day, 0, 0, 0);
                DateTime m_dataTo = new DateTime(dtreg.Year, dtreg.Month, dtreg.Day, 23, 59, 0);

                var obj = from x in context.Movimenti
                          join y in context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                          where ((y.CodCausale == codiceCausale) && (x.IsDeleted == false) &&
                                     (EntityFunctions.TruncateTime(x.DataRegistrazione) >= EntityFunctions.TruncateTime(m_dataFrom)) &&
                                      EntityFunctions.TruncateTime(x.DataRegistrazione) <= EntityFunctions.TruncateTime(m_dataTo)
                                 )
                          orderby x.DataMovimento descending
                          select new Movimento
                          {
                              IDMovimento = x.IDMovimento,
                              DataMovimento = x.DataMovimento,
                              DataRegistrazione=x.DataRegistrazione,
                              IDCausale = x.IDCausale,
                              CodCausale = x.CausaliMagazzino.CodCausale,
                              NumDdt = x.Lotti.NumDdt,
                              DataDdt = x.Lotti.DataDdt,

                              IDPolvere = x.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,

                              IDFamiglia = x.IDFamiglia,
                              Famiglia = x.AnagFamiglie.Descrizione,

                              IDFormato = x.IDFormato,
                              Formato = x.FormatoScatole.Formato,

                              NumScatole = x.NumScatole,
                              Quantita = x.Quantita,
                              GiacenzaFinale = x.Lotti.Giacenza,
                              GiacenzaIniziale = x.Lotti.Giacenza_iniziale,
                              Giacenza = x.Giacenza,
                              //ValoreFinale = x.Lotti.Valore,
                              ValoreFinale = x.Lotti.Giacenza * x.Lotti.PrezzoUnitario,
                              //Valore = x.Valore,
                              NumFattura = x.Lotti.NumFattura,
                              DataFattura = x.Lotti.DataFattura,
                              Note = x.Note,
                              IDOperatore = x.IDOperatore,
                              Operatore = x.aspnet_Users.UserName,

                              IDLotto = x.IDLotto,
                              CodiceLotto = x.Lotti.CodLotto,
                              DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,

                              PrezzoUnitario = x.Lotti.PrezzoUnitario,
                              CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                              GiacenzaInsufficienteFlag = x.GiacenzaNegativa,
                              SottoScortaFlag = x.Sottoscorta,

                              //RowVersion = x.RowVersion
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    LoadInformazioniAccessorie(retValue);
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Movimento> GetMovimenti(string codiceCausale)
        {
            List<Movimento> retValue = null;

            try
            {
                DateTime m_dataFrom = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 0, 0, 0);
                DateTime m_dataTo = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, 23, 59, 0);

                var obj = from x in context.Movimenti
                          join y in context.CausaliMagazzino on x.IDCausale equals y.IDCausale
                          where ((y.CodCausale == codiceCausale) && (x.IsDeleted == false) && 
                                     (EntityFunctions.TruncateTime(x.DataRegistrazione) >= EntityFunctions.TruncateTime(m_dataFrom)) &&
                                      EntityFunctions.TruncateTime(x.DataRegistrazione) <= EntityFunctions.TruncateTime(m_dataTo)
                                 )
                          orderby x.DataMovimento descending
                          select new Movimento
                          {
                              IDMovimento = x.IDMovimento,
                              DataMovimento = x.DataMovimento,
                              IDCausale = x.IDCausale,
                              CodCausale = x.CausaliMagazzino.CodCausale,
                              NumDdt = x.Lotti.NumDdt,
                              DataDdt = x.Lotti.DataDdt,

                              IDPolvere = x.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,

                              IDFamiglia = x.IDFamiglia,
                              Famiglia = x.AnagFamiglie.Descrizione,

                              IDFormato = x.IDFormato,
                              Formato = x.FormatoScatole.Formato,

                              NumScatole = x.NumScatole,
                              Quantita = x.Quantita,
                              GiacenzaFinale = x.Lotti.Giacenza,
                              GiacenzaIniziale = x.Lotti.Giacenza_iniziale,
                              Giacenza = x.Giacenza,
                              //ValoreFinale = x.Lotti.Valore,
                              ValoreFinale=x.Lotti.Giacenza*x.Lotti.PrezzoUnitario,                              
                              //Valore = x.Valore,
                              NumFattura = x.Lotti.NumFattura,
                              DataFattura = x.Lotti.DataFattura,
                              Note = x.Note,
                              IDOperatore = x.IDOperatore,
                              Operatore = x.aspnet_Users.UserName,

                              IDLotto = x.IDLotto,
                              CodiceLotto = x.Lotti.CodLotto,
                              DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,

                              PrezzoUnitario = x.Lotti.PrezzoUnitario,
                              CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                              GiacenzaInsufficienteFlag=x.GiacenzaNegativa,
                              SottoScortaFlag=x.Sottoscorta,

                              //RowVersion = x.RowVersion
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    LoadInformazioniAccessorie(retValue);
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Movimento2> GetMovimenti()
        {
            List<Movimento2> retValue = null;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IsDeleted == false
                          orderby x.DataMovimento descending
                          select new Movimento2
                          {
                              IDMovimento = x.IDMovimento,
                              DataMovimento = x.DataMovimento,
                              IDCausale = x.IDCausale,
                              CodCausale = x.CausaliMagazzino.CodCausale,
                              NumDdt = x.Lotti.NumDdt,
                              DataDdt = x.Lotti.DataDdt,

                              IDPolvere = x.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              CodicePolvere_old = x.AnagPolveri.CodicePolvere,
                              DescrizionePolvere = x.AnagPolveri.Descrizione,

                              IDFamiglia = x.IDFamiglia,
                              Famiglia = x.AnagFamiglie.Descrizione,

                              IDFormato = x.IDFormato,
                              Formato = x.FormatoScatole.Formato,
                              Pezzatura = x.FormatoScatole.Pezzatura,

                              NumScatole = x.NumScatole,
                              Quantita = x.Quantita,
                              Quantita_old = x.Quantita,


                              GiacenzaFinale = x.Lotti.Giacenza,
                              ValoreFinale = x.Lotti.Valore,
                              GiacenzaIniziale = x.Lotti.Giacenza_iniziale,

                              //Giacenza = x.Giacenza,
                              //Valore = x.Valore,

                              NumFattura = x.Lotti.NumFattura,
                              DataFattura = x.Lotti.DataFattura,
                              
                              Note = x.Note,
                              NotePolvere = x.AnagPolveri.Note,

                              IDOperatore = x.IDOperatore,
                              Operatore = x.aspnet_Users.UserName,

                              IDLotto = x.IDLotto,
                              IDLotto_old = x.IDLotto,
                              CodiceLotto = x.Lotti.CodLotto,
                              CodiceLotto_old = x.Lotti.CodLotto,

                              DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,

                              PrezzoUnitario = x.Lotti.PrezzoUnitario,
                              CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                              SottoScortaFlag = x.Sottoscorta,
                              GiacenzaInsufficienteFlag = x.GiacenzaNegativa,

                              //RowVersion = x.RowVersion
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                    if (mmm != null)
                    {
                        foreach (Movimento2 p in retValue)
                        {
                            LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.IDPolvere);

                            p.Famiglia = r.Famiglia;
                            p.ColoriAbbinati = r.ColoriAbbinati;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Movimento2> GetMovimenti(FilterBase<Movimenti> filter)
        {
            List<Movimento2> retValue = null;

            try
            {
                var obj = (from x in context.Movimenti.AsExpandable().Where(filter.SetUpFilter())
                          where x.IsDeleted == false
                          orderby x.DataMovimento descending
                          select new Movimento2
                          {
                              IDMovimento = x.IDMovimento,
                              DataMovimento = x.DataMovimento,
                              IDCausale = x.IDCausale,
                              CodCausale = x.CausaliMagazzino.CodCausale,
                              NumDdt = x.Lotti.NumDdt,
                              DataDdt = x.Lotti.DataDdt,

                              IDPolvere = x.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,
                              CodicePolvere_old = x.AnagPolveri.CodicePolvere,
                              DescrizionePolvere = x.AnagPolveri.Descrizione,

                              IDFamiglia = x.IDFamiglia,
                              Famiglia = x.AnagFamiglie.Descrizione,

                              IDFormato = x.IDFormato,
                              Formato = x.FormatoScatole.Formato,
                              Pezzatura = x.FormatoScatole.Pezzatura,

                              NumScatole = x.NumScatole,
                              Quantita = x.Quantita,
                              Quantita_old = x.Quantita,


                              GiacenzaFinale = x.Lotti.Giacenza,
                              ValoreFinale = x.Lotti.Valore,
                              GiacenzaIniziale = x.Lotti.Giacenza_iniziale,

                              //Giacenza = x.Giacenza,
                              //Valore = x.Valore,

                              NumFattura = x.Lotti.NumFattura,
                              DataFattura = x.Lotti.DataFattura,

                              Note = x.Note,
                              NotePolvere = x.AnagPolveri.Note,

                              IDOperatore = x.IDOperatore,
                              Operatore = x.aspnet_Users.UserName,

                              IDLotto = x.IDLotto,
                              IDLotto_old = x.IDLotto,
                              CodiceLotto = x.Lotti.CodLotto,
                              CodiceLotto_old = x.Lotti.CodLotto,

                              DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,

                              PrezzoUnitario = x.Lotti.PrezzoUnitario,
                              CausaleScarico = x.CausaliScarico.CodCausaleScarico,
                              SottoScortaFlag = x.Sottoscorta,
                              GiacenzaInsufficienteFlag = x.GiacenzaNegativa,

                              //RowVersion = x.RowVersion
                          });

                if (obj.Any())
                {
                    retValue = obj.ToList();

                    List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
                    if (mmm != null)
                    {
                        foreach (Movimento2 p in retValue)
                        {
                            LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.IDPolvere);

                            p.Famiglia = r.Famiglia;
                            p.ColoriAbbinati = r.ColoriAbbinati;
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AddMovimento(Movimento movimento)
        {
            bool retValue = false;

            try
            {
                Movimenti imp = new Movimenti();
                //imp.IDMovimento = movimento.IDMovimento;
                imp.DataMovimento = movimento.DataMovimento;
                imp.IDCausale = movimento.IDCausale;
                //imp.NDdt =movimento.NumDdt;
                //imp.DataDdt =movimento.DataDdt;
                imp.IDPolvere = movimento.IDPolvere;
                imp.IDFormato = movimento.IDFormato;
                imp.NumScatole = movimento.NumScatole;
                imp.DataRegistrazione = movimento.DataRegistrazione;

                imp.Quantita = movimento.Quantita;
                imp.Giacenza = movimento.Giacenza;
                imp.Valore = imp.Giacenza * movimento.PrezzoUnitario;

                imp.Note = movimento.Note;
                imp.IDOperatore = movimento.IDOperatore;
                imp.IDLotto = movimento.IDLotto;
                imp.IDImpianto = movimento.IDImpianto;
                imp.IDFamiglia = movimento.IDFamiglia;

                imp.IsDeleted = false;

                imp.IDCausaleScarico = movimento.IDCausaleScarico;

                imp.GiacenzaNegativa = movimento.GiacenzaInsufficienteFlag;
                imp.Sottoscorta = movimento.SottoScortaFlag;

                //
                context.Movimenti.AddObject(imp);
                context.SaveChanges();

                movimento.IDMovimento = imp.IDMovimento;

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool DeleteMovimento(Movimento movimento)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    Movimenti m = obj.FirstOrDefault();
                    m.IsDeleted = true;

                    //this.GetContext().Movimenti.DeleteObject(obj.FirstOrDefault());
                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool DeleteFisicaMovimento(Movimento movimento)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    context.Movimenti.DeleteObject(obj.FirstOrDefault());
                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool ModifyMovimento(Movimento movimento)
        {
            bool retValue = false;

            bool[] retValue2 = new bool[] { false };

            #region Concurrency ?
            ManageConcurrency(() => {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    Movimenti imp = obj.FirstOrDefault();

                    imp.DataMovimento = movimento.DataMovimento;
                    imp.DataRegistrazione = movimento.DataRegistrazione;
                    imp.IDCausale = movimento.IDCausale;
                    imp.IDPolvere = movimento.IDPolvere;
                    imp.IDFormato = movimento.IDFormato;
                    imp.NumScatole = movimento.NumScatole;

                    imp.Quantita = movimento.Quantita;
                    imp.Giacenza = movimento.Giacenza;
                    imp.Valore = imp.Giacenza * movimento.PrezzoUnitario;

                    imp.Note = movimento.Note;
                    imp.IDOperatore = movimento.IDOperatore;
                    imp.IDLotto = movimento.IDLotto;
                    imp.IDImpianto = movimento.IDImpianto;
                    imp.IDFamiglia = movimento.IDFamiglia;

                    imp.GiacenzaNegativa = movimento.GiacenzaInsufficienteFlag;
                    imp.Sottoscorta = movimento.SottoScortaFlag;

                    imp.IsDeleted = false;

                    imp.IDCausaleScarico = movimento.IDCausaleScarico;

                    var q = ((ObjectQuery)obj).ToTraceString();
                    Console.WriteLine(q);

                    context.SaveChanges();

                    //retValue = true;
                }
            }, retValue2);
            #endregion

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    Movimenti imp = obj.FirstOrDefault();

                    imp.DataMovimento = movimento.DataMovimento;
                    imp.DataRegistrazione = movimento.DataRegistrazione;
                    imp.IDCausale = movimento.IDCausale;
                    imp.IDPolvere = movimento.IDPolvere;
                    imp.IDFormato = movimento.IDFormato;
                    imp.NumScatole = movimento.NumScatole;

                    imp.Quantita = movimento.Quantita;
                    imp.Giacenza = movimento.Giacenza;
                    imp.Valore = imp.Giacenza * movimento.PrezzoUnitario;

                    imp.Note = movimento.Note;
                    imp.IDOperatore = movimento.IDOperatore;
                    imp.IDLotto = movimento.IDLotto;
                    imp.IDImpianto = movimento.IDImpianto;
                    imp.IDFamiglia = movimento.IDFamiglia;

                    imp.GiacenzaNegativa = movimento.GiacenzaInsufficienteFlag;
                    imp.Sottoscorta = movimento.SottoScortaFlag;

                    imp.IsDeleted = false;

                    imp.IDCausaleScarico = movimento.IDCausaleScarico;

                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }


        public bool ModifyNoteMovimento(Movimento movimento)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    Movimenti imp = obj.FirstOrDefault();

                    
                    imp.Note = movimento.Note;
                    imp.IDOperatore = movimento.IDOperatore;       
             
                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
        //public bool ModifyCronologia(Movimento2 movimento)
        //{
        //    bool retValue = false;

        //    try
        //    {
        //        var obj = from x in this.GetContext().Movimenti
        //                  where x.IDMovimento == movimento.IDMovimento
        //                  select x;

        //        if (obj.Any())
        //        {
        //            Movimenti imp = obj.FirstOrDefault();

        //            imp.DataMovimento = movimento.DataMovimento;
        //            imp.IDCausale = movimento.IDCausale;
        //            imp.IDPolvere = movimento.IDPolvere;
        //            imp.IDFormato = movimento.IDFormato;
        //            imp.NumScatole = movimento.NumScatole;

        //            imp.Quantita = movimento.NumScatole * movimento.Pezzatura;
        //            imp.Giacenza = movimento.Giacenza;
        //            imp.Valore = movimento.Valore;

        //            imp.Note = movimento.Note;
        //            imp.IDOperatore = movimento.Operatore;
        //            imp.IDLotto = movimento.IDLotto;
        //            imp.IDImpianto = movimento.IDImpianto;
        //            imp.IDFamiglia = movimento.IDFamiglia;

        //            imp.IsDeleted = false;
        //            imp.IDCausaleScarico = movimento.IDCausaleScarico;

        //            imp.Sottoscorta = movimento.SottoScortaFlag;
        //            imp.GiacenzaNegativa = movimento.GiacenzaInsufficienteFlag;

        //            //this.GetContext().SaveChanges();

        //            //modifico il lotto associato
        //            Lotti l = imp.Lotti;
        //            l.CodLotto = movimento.CodiceLotto;
        //            l.DataScadenzaLotto = movimento.DataScadenzaLotto;
        //            l.DataDdt = movimento.DataDdt;
        //            l.NumDdt = movimento.NumDdt;
        //            l.NumFattura = movimento.NumFattura;
        //            l.DataFattura = movimento.DataFattura;
        //            l.PrezzoUnitario = movimento.PrezzoUnitario;

        //            CausaliMagazzinoFacade cm = new CausaliMagazzinoFacade();
        //            string ca = (cm.GetCausaleByID(imp.IDCausale)).CodCausale;

        //            if (ca == "C")
        //            {                        
        //                double qscar = GetScarichiQuant(imp.Lotti.IDLotto);

        //                l.Giacenza = movimento.GiacenzaIniziale - qscar;                        
        //                l.Valore = l.Giacenza * movimento.PrezzoUnitario;
        //                l.Giacenza_iniziale = movimento.GiacenzaIniziale;
                        

        //                //LottoFacade lotf = new LottoFacade();
        //                //lotf.ModifyLotto(l, qscar);
        //                //in questo punto la giacenza progressiva sui movimenti non è stata aggiornata 
        //                //se dovesse servire bisognerebbe aggiornarla opportunamente 
        //                if (qscar > 0 && movimento.CodicePolvere_old != imp.AnagPolveri.CodicePolvere)
        //                    AggScarichi(imp.Lotti.IDLotto, imp.IDPolvere);
        //            }

        //            if (ca == "S")
        //            {
        //                //Ripristino giacenza lotto vecchio                                                             
        //                LottoFacade lot = new LottoFacade();
        //                lot.RipristinoLotto(movimento.IDLotto_old, movimento.Quantita_old);

        //                //Aggiorno la giacenza lotto nuovo
        //                //lot.AggLotto(movimento.IDLotto, imp.Quantita);

        //                l.Giacenza = l.Giacenza - imp.Quantita;
        //                l.Valore = l.Giacenza * l.PrezzoUnitario;
        //            }


        //            //MovimentiFacade mf = new MovimentiFacade();
        //            //mf.AggMovimento(imp.IDMovimento);

        //            this.GetContext().SaveChanges();

        //            retValue = true;
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        // throw ex;
        //    }

        //    return retValue;
        //}

        public bool DeleteCronologia(Movimento2 movimento)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == movimento.IDMovimento
                          select x;

                if (obj.Any())
                {
                    LottoFacade lot = new LottoFacade();
                    if (movimento.CodCausale == "S")
                    {
                        if (lot.RipristinoLotto(movimento.IDLotto_old, movimento.Quantita_old))
                        {
                            if (DeleteFisicaMovimento(movimento))
                            {
                                ComposizioneColoreFacadeExt pf = new ComposizioneColoreFacadeExt();
                                List<Colore> m_coloriAssociati = pf.GetColoriAssociati(movimento.IDPolvere);
                                AddToStoricoColoriMovimenti(movimento.IDMovimento, m_coloriAssociati, "D");
                            }
                        }
                    }
                    if (movimento.CodCausale == "C")
                    {
                        DeleteFisicaMovimento(movimento);

                        lot.DeleteLotto(movimento.IDLotto);
                    }
                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public List<Movimento> GetMovimentoByImpianto(int idImpianto)
        {
            List<Movimento> retValue = null;

            var obj = from x in context.Movimenti
                      where x.IDImpianto == idImpianto && x.IsDeleted == false
                      select new Movimento
                      {
                          IDMovimento = x.IDMovimento,
                          //RowVersion = x.RowVersion
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Movimento> GetMovimentoByScatola(int idScatola)
        {
            List<Movimento> retValue = null;

            var obj = from x in context.Movimenti
                      where x.IDFormato == idScatola && x.IsDeleted == false
                      select new Movimento
                      {
                          IDMovimento = x.IDMovimento,
                          //RowVersion = x.RowVersion
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public List<Movimento> GetMovimentoByPolvere(int idPolvere)
        {
            List<Movimento> retValue = null;

            var obj = from x in context.Movimenti
                      where x.IDPolvere == idPolvere && x.IsDeleted == false
                      select new Movimento
                      {
                          IDMovimento = x.IDMovimento,
                          //RowVersion = x.RowVersion
                      };

            if (obj.Any())
            {
                retValue = obj.ToList();
            }

            return retValue;
        }

        public Movimento2 GetMovimentoByLotto(long idLotto, int idCausale)
        {
            Movimento2 retValue = null;

            var obj = from x in context.Movimenti
                      where x.IDLotto == idLotto && x.IsDeleted == false && x.IDCausale==idCausale
                      select new Movimento2
                      {
                          IDMovimento = x.IDMovimento,
                          IDFormato=x.IDFormato,
                          Formato=x.FormatoScatole.Formato,
                          Pezzatura=x.FormatoScatole.Pezzatura,
                          //RowVersion = x.RowVersion
                      };

            if (obj.Any())
            {
                retValue = obj.FirstOrDefault();
            }

            return retValue;
        }

        public Movimento GetMovimento(long idmovimento)
        {
            Movimento retValue = null;
            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == idmovimento
                          select new Movimento
                          {
                              IDMovimento = x.IDMovimento,
                              DataMovimento = x.DataMovimento,
                              IDCausale = x.IDCausale,
                              CodCausale = x.CausaliMagazzino.CodCausale,
                              NumDdt = x.Lotti.NumDdt,
                              DataDdt = x.Lotti.DataDdt,

                              IDPolvere = x.IDPolvere,
                              CodicePolvere = x.AnagPolveri.CodicePolvere,

                              IDFormato = x.IDFormato,
                              Formato = x.FormatoScatole.Formato,

                              NumScatole = x.NumScatole,
                              Quantita = x.Quantita,
                              Note = x.Note,
                              IDOperatore = x.IDOperatore,
                              Operatore=x.aspnet_Users.UserName,

                              IDLotto = x.IDLotto,
                              CodiceLotto = x.Lotti.CodLotto,
                              GiacenzaFinale = x.Lotti.Giacenza,

                              ValoreFinale = x.Lotti.Valore,
                              DataScadenzaLotto = x.Lotti.DataScadenzaLotto,
                              //

                              IDImpianto = x.IDImpianto,
                              Impianto = x.Impianti.Impianto,

                              //RowVersion = x.RowVersion
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
            }
            return retValue;
        }

        public bool AggMovimento(long idmovimento)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDMovimento == idmovimento
                          select x;

                if (obj.Any())
                {
                    Movimenti imp = obj.FirstOrDefault();

                    imp.Giacenza = imp.Lotti.Giacenza;
                    imp.Valore = imp.Lotti.Valore;
                    //imp.RowVersion = imp.RowVersion;

                    context.SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
            }

            return retValue;
        }

        //public long GetCambi()
        //{
        //    long retValue = 0;

        //    try
        //    {


        //        GestionePolveriEntities m_context = this.GetContext();
        //        var obj = (from x in m_context.Movimenti
        //                  join y in m_context.CausaliMagazzino on x.IDCausale equals y.IDCausale
        //                  where y.CodCausale == "S"
        //                  join z in m_context.Impianti on x.IDImpianto equals z.IDImpianto   

        //                   group x  by  x.IDImpianto into cambi)

        //                  //select new  
        //                  //{cambi};

        //        if (obj.Any())
        //        {
        //            retValue = obj.ToList();
        //        }
        //    }
        //    catch (Exception ex)
        //    {
        //        // throw ex;
        //    }

        //    return retValue;
        //}

        public void AddToStoricoColoriMovimenti(long idMovimento, List<Colore> coloriAssociati, string tipoMovimento)
        {
            if (coloriAssociati == null) return;

            foreach (Colore c in coloriAssociati)
            {
                StoricoColoriMovimenti scm = new StoricoColoriMovimenti();
                scm.CodiceColore = c.CodiceColore;
                scm.Famiglia = c.Famiglia.Descrizione;
                scm.IDMovimento = idMovimento;
                scm.DataMovimento = DateTime.Now;
                scm.TipoMovimento = tipoMovimento;

                context.StoricoColoriMovimenti.AddObject(scm);
            }

            context.SaveChanges();
        }

        public void AddToStoricoMovimenti(Movimento movimento)
        {
            StoricoMovimenti sm = new StoricoMovimenti();
            sm.IDMovimento = movimento.IDMovimento;
            sm.GiacenzaNegativa = movimento.GiacenzaInsufficienteFlag;
            sm.Sottoscorta = movimento.SottoScortaFlag;
            sm.IDOperatore = movimento.IDOperatore.GetValueOrDefault();
            sm.Giacenza = movimento.Giacenza;
            //sm.Valore = (movimento.GiacenzaProgressiva * movimento.PrezzoUnitario.GetValueOrDefault());
            sm.Valore = (movimento.Giacenza * movimento.PrezzoUnitario);

            context.StoricoMovimenti.AddObject(sm);
            context.SaveChanges();
        }

        public string GetStoricoColoriMovimento(long idMovimento)
        {
            string retValue = string.Empty;

            try
            {
                var obj = string.Join(",", (from x in context.StoricoColoriMovimenti
                                            where x.IDMovimento == idMovimento
                                            select new
                                            {
                                                x.CodiceColore,
                                                x.Famiglia
                                            }));

                if (obj.Any())
                {
                    retValue = obj.ToString();

                    retValue = retValue.Replace("CodiceColore =".Trim(), "").Replace("Famiglia = ".Trim(), "");
                }
            }
            catch (Exception ex)
            {

            }

            return retValue;
        }

        public double GetScarichiQuant(long idlotto)
        {
            double retValue = 0;

            try
            {
                var obj = (from x in context.Movimenti
                           where x.IDLotto == idlotto && x.CausaliMagazzino.CodCausale == "S"
                           select (double?)x.Quantita).Sum() ?? 0;

                //if (obj.Any())
                //{
                retValue = (double)obj;
                //}
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool AggScarichi(long idlotto, int idpolvere)
        {
            bool retValue = false;

            try
            {
                var obj = from x in context.Movimenti
                          where x.IDLotto == idlotto && x.CausaliMagazzino.CodCausale == "S"
                          select x;

                foreach (Movimenti imp in obj)
                {
                    imp.IDPolvere = idpolvere;                       
                }

                context.SaveChanges();
                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            
            return retValue;
        }

        public double GetTotaleMovimenti(string tipoMovimento)
        {
            double retValue = 0;

            try
            {
                retValue = (from x in context.Movimenti
                            where x.CausaliMagazzino.CodCausale == tipoMovimento
                            select x).Sum(x => x.Quantita);
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        private void LoadInformazioniAccessorie(List<Movimento> retValue)
        {
            List<LookUp_FamiglieColori_ColoriAbbinati_Result> mmm = (List<LookUp_FamiglieColori_ColoriAbbinati_Result>)FrameworkLib.Utilities.Singleton<GestionePolveriLib.Cache.LookUpData>.Instance.GetData("LookupFamiglie");
            foreach (Movimento p in retValue)
            {
                LookUp_FamiglieColori_ColoriAbbinati_Result r = mmm.Find(x => x.IDPolvere == p.IDPolvere);

                if (r != null)
                {
                    p.FamiglieColori = r.Famiglia;
                    p.ColoriAbbinati = r.ColoriAbbinati;
                }
            }
        }
    }
}
